package org.apache.dubbo.demo.config;

import org.apache.dubbo.api.demo.DemoService;
import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.ProtocolConfig;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.ServiceConfig;
import org.apache.dubbo.config.bootstrap.DubboBootstrap;
import org.apache.dubbo.demo.DemoServiceImpl;
import org.apache.dubbo.api.demo.GlobalConstant;

import java.util.HashMap;
import java.util.Map;

public class TestServiceConfigApp implements GlobalConstant {

    public static DubboBootstrap bootstrap = DubboBootstrap.getInstance();

    public static boolean isStop = false;

    public static void main(String[] args) {

        ApplicationConfig applicationConfig = new ApplicationConfig();
        applicationConfig.setName("my-provider");
        applicationConfig.setVersion("1.2.7"); // 会注册，但无实际作用。注册到URI中的KEY是application.version。标注的应用的版本信息。唯一注册带有【application.】前缀的KEY。
        applicationConfig.setOwner("king");// 会注册，但无实际作用。如果parameters中有owner，则会覆盖。注册到URI中的KEY是 owner,这个区别与version，是不带用【application.】前缀的。
        applicationConfig.setEnvironment("test"); // 会注册，但无实际作用。如果parameters中有owner，则会覆盖。注册到URI中的KEY是 owner,这个区别与version，是不带用【application.】前缀的。
        applicationConfig.setArchitecture("singleType"); // 会注册，但无实际作用。如果parameters中有architecture，则会覆盖。注册到URI中的KEY是 architecture,这个区别与version，是不带用【application.】前缀的。

        // 不会注册，区别于Owner\Version。一个会注册一个不会注册。即使设置了，也不会注册到URI中。
        applicationConfig.setId("1234567890");

        Map<String, String> parameters = new HashMap<>();
        parameters.put("param1", "value1");
        parameters.put("param2", "value2");
        parameters.put("owner", "value3");// 会替换 applicationConfig.setOwner("king");
        parameters.put("environment", "test-changed");// 会替换 applicationConfig.setEnvironment("test");
        parameters.put("architecture", "singleType-changed");// 会替换 applicationConfig.setArchitecture("singleType");
        parameters.put("id", "1234567891");
        // parameters.put("timeout", "20000"); 不会对注册行为生效，要设置到registryParameters中。
        //parameters.put("version", "1.2.8");// 启动时，RegistryProtocol.doRegister()会抛NullPointerException,原因是provider找不到带版本信息的注册信息。

        applicationConfig.setParameters(parameters);// 会替换ApplicationConfig中的所有参数.
        //applicationConfig.setEnableEmptyProtection(true);

        RegistryConfig registryConfig = new RegistryConfig();
        registryConfig.setAddress(REGISTRY_URL);
        registryConfig.setGroup(REGISTRY_GROUP); // 注册节点分组
        // 以下属性信息，无实际作用，也不会把该信息注册到zookeeper中, begins。
        registryConfig.setVersion("Registry-NotPushed-Version-1.0.0");
        registryConfig.setServer("Registry-NotPushed-Server-A");
        registryConfig.setClient("Registry-NotPushed-Client-A");
        registryConfig.setZone("Registry-NotPushed-Zone-A");
        registryConfig.setCluster("Registry-NotPushed-Cluster-A");
        registryConfig.setCheck(true);
        // 以属性信息，无实际作用，也不会把该信息注册到zookeeper中,ends。


        // timeout 单位毫秒，默认30000毫秒，DEFAULT_CONNECTION_TIMEOUT_MS = 30 * 1000;
        Map<String,String> registryParameters = new HashMap<>();
        registryParameters.put("registry-param1", "value1");
        registryParameters.put("registry-param2", "value2");
        registryParameters.put("dynamic", "false"); // 实测，无实际作用。

        registryConfig.setParameters(registryParameters);
        registryConfig.setSession(60001);// 即使注释下一行，此行也不生产。参见[Curator5ZookeeperClient]
        registryParameters.put("session", "60002"); // 生效，设置ZK服务端，判定客户端失效时间。
        registryConfig.setTimeout(20000);// 设置尝试接时间，在该时间内，会不断尝试，超出此时间，会抛出异常。
        registryConfig.setFile("D:/registry.cache");
        // 实测下面的属性信息，无实际作用。即使设置，也不会基于此进行注册。该信息，不会写入到注册中心，不会写入到注册信息中。
        //registryConfig.setDynamic(false);// 实测，无实际作用。


        ServiceConfig<DemoServiceImpl> serviceConfig = new ServiceConfig<>();
        serviceConfig.setInterface(DemoService.class);
        serviceConfig.setRef(new DemoServiceImpl());
        serviceConfig.setDynamic(true);// 会进行注册，决定写入ZK是临时还是永久节点。
        serviceConfig.setGroup("Service-Group-A");
        //serviceConfig.setVersion("1.2.99");
        //serviceConfig.setApplication(applicationConfig);

        bootstrap.application(applicationConfig)
                .registry(registryConfig)
                .protocol(new ProtocolConfig(CommonConstants.DUBBO, 20881))
                .service(serviceConfig) // 注释此行没有任何信息会注册到注册中心。但也不会报错。
                .start(false);
        System.out.println("dubbo serviceConfig started?");



        try {
            while (true) {
                if (isStop) {
                    break;
                }
                Thread.sleep(10000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void test(String[] args) {
        System.out.println("Hello World!");
    }

}
